home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Monster Media 1996 #15
/
Monster Media Number 15 (Monster Media)(July 1996).ISO
/
bbs_util
/
bsrc_260.zip
/
SRC.ZIP
/
EMSI.C
< prev
next >
Wrap
C/C++ Source or Header
|
1996-03-23
|
31KB
|
1,272 lines
/*--------------------------------------------------------------------------*/
/* */
/* */
/* ------------ Bit-Bucket Software, Co. */
/* \ 10001101 / Writers and Distributors of */
/* \ 011110 / Freely Available<tm> Software. */
/* \ 1011 / */
/* ------ */
/* */
/* (C) Copyright 1987-96, Bit Bucket Software Co. */
/* */
/* This module was written by Tobias Burchhardt */
/* */
/* BinkleyTerm EMSI-Handshake Processor */
/* */
/* */
/* For complete details of the licensing restrictions, please refer */
/* to the License agreement, which is published in its entirety in */
/* the MAKEFILE and BT.C, and also contained in the file LICENSE.260. */
/* */
/* USE OF THIS FILE IS SUBJECT TO THE RESTRICTIONS CONTAINED IN THE */
/* BINKLEYTERM LICENSING AGREEMENT. IF YOU DO NOT FIND THE TEXT OF */
/* THIS AGREEMENT IN ANY OF THE AFOREMENTIONED FILES, OR IF YOU DO */
/* NOT HAVE THESE FILES, YOU SHOULD IMMEDIATELY CONTACT BIT BUCKET */
/* SOFTWARE CO. AT ONE OF THE ADDRESSES LISTED BELOW. IN NO EVENT */
/* SHOULD YOU PROCEED TO USE THIS FILE WITHOUT HAVING ACCEPTED THE */
/* TERMS OF THE BINKLEYTERM LICENSING AGREEMENT, OR SUCH OTHER */
/* AGREEMENT AS YOU ARE ABLE TO REACH WITH BIT BUCKET SOFTWARE, CO. */
/* */
/* */
/* You can contact Bit Bucket Software Co. at any one of the following */
/* addresses: */
/* */
/* Bit Bucket Software Co. FidoNet 1:104/501, 1:343/491 */
/* P.O. Box 460398 AlterNet 7:42/1491 */
/* Aurora, CO 80046 BBS-Net 86:2030/1 */
/* Internet f491.n343.z1.fidonet.org */
/* */
/* Please feel free to contact us at any time to share your comments about */
/* our software and/or licensing policies. */
/* */
/*--------------------------------------------------------------------------*/
/* Include this file before any other includes or defines! */
#include "includes.h"
static int LOCALFUNC Send_EMSI_Packet (int);
static int LOCALFUNC Recv_EMSI_Packet (int);
static int LOCALFUNC get_emsi (char *);
static char *LOCALFUNC b7strcat (char *, char *);
static int LOCALFUNC recode_from_b7 (char *, int);
static int LOCALFUNC match_aka (ADDRP);
static char *LOCALFUNC get_bracket (char *);
static char *LOCALFUNC cat_bracket (char *, char *);
static int LOCALFUNC get_level (ADDRP addr, ADDRP myaka);
static int LOCALFUNC Encode_EMSI_Header (char *, int);
static int LOCALFUNC Decode_EMSI_Header (char *, int, int);
static int highest_level, hl_aka; /* Used for passwording */
/*--------------------------------------------------------------------------*/
/* EMSI SENDER (used when I am the CALLING system) */
/*--------------------------------------------------------------------------*/
int
EMSI_Sender (void)
{
char *sptr;
highest_level = hl_aka = num_rakas = 0;
sptr = NULL;
if (un_attended && fullscreen)
{
sb_move (filewin, 2, 2);
sb_puts (filewin, MSG_TXT (M_EMXMIT));
sb_show ();
}
else
{
set_xy (MSG_TXT (M_EMSEND));
}
/*--------------------------------------------------------------------*/
/* Clean up any mess that may be around */
/*--------------------------------------------------------------------*/
CLEAR_INBOUND ();
XON_DISABLE ();
if (!Send_EMSI_Packet (1))
{
sptr = MSG_TXT (M_HE_HUNG_UP);
status_line (sptr);
return (0);
}
if (un_attended && fullscreen)
{
sb_move (filewin, 2, 2);
sb_puts (filewin, MSG_TXT (M_EMWAIT));
sb_show ();
}
else
{
set_xy (MSG_TXT (M_EMRECV));
}
return Recv_EMSI_Packet (1);
}
/*--------------------------------------------------------------------------*/
/* EMSI RECEIVER (Used when I am the CALLED system) */
/*--------------------------------------------------------------------------*/
int
EMSI_Receiver (void)
{
int i;
highest_level = hl_aka = num_rakas = 0;
if (un_attended && fullscreen)
{
sb_move (filewin, 2, 2);
sb_puts (filewin, MSG_TXT (M_EMWAIT));
sb_show ();
}
else
{
set_xy (MSG_TXT (M_EMRECV));
}
/*--------------------------------------------------------------------*/
/* Clean up any mess that may be around */
/*--------------------------------------------------------------------*/
CLEAR_OUTBOUND ();
XON_DISABLE ();
if (Recv_EMSI_Packet (0) == 0)
return (0);
if (un_attended && fullscreen)
{
sb_move (filewin, 2, 2);
sb_puts (filewin, MSG_TXT (M_EMXMIT));
sb_show ();
}
else
{
set_xy (MSG_TXT (M_EMSEND));
}
if ((i = Send_EMSI_Packet (0)) == 0)
b_init ();
return (i);
} /* EMSI Receiver */
/*--------------------------------------------------------------------------*/
/* SEND EMSI PACKET */
/*--------------------------------------------------------------------------*/
static int LOCALFUNC
Send_EMSI_Packet (int Sender)
{
int i;
char *sptr;
long T1, T2;
word crc, len;
word tries = 0;
char *junkbuff, *uni;
/*
* Txbuf is (8192+16) in length
* junkbuff wants to be 4096
* uni wants to be 256
* We reserve the last 1024+16 for lower level functions
*
* If you change this way of doing things, you have to change
* Encode_EMSI_Header as well!!!
*/
junkbuff = (char *) Txbuf;
uni = &junkbuff[4096];
/*--------------------------------------------------------------------*/
/* Setup EMSI structure */
/*--------------------------------------------------------------------*/
len = Encode_EMSI_Header (junkbuff, Sender);
/*--------------------------------------------------------------------*/
/* Disable handshaking and ^C/^K handling */
/*--------------------------------------------------------------------*/
XON_DISABLE ();
/*--------------------------------------------------------------------*/
/* Send the packet. */
/* Load outbound buffer quickly, and get modem busy sending. */
/*--------------------------------------------------------------------*/
tries = 0;
T1 = timerset (6000);
xmit_packet:
sprintf (uni, "%s%04X", &(emsistr[EMSI_DAT][2]), len);
crc = crc_block ((unsigned char *) uni, strlen (uni));
SENDCHARS ("**", 2, 1);
SENDCHARS (uni, strlen (uni), 1);
SENDCHARS (junkbuff, len, 1);
/*--------------------------------------------------------------------*/
/* Calculate CRC while modem is sending its buffer */
/*--------------------------------------------------------------------*/
for (i = 0; i < (int) len; i++)
crc = xcrc (crc, junkbuff[i]);
CLEAR_INBOUND ();
sprintf (uni, "%04X\r", crc);
SENDCHARS (uni, strlen (uni), 1);
if (tries++ > 6)
{
(void) sprintf (uni, "!%s", MSG_TXT (M_TIMEOUT));
sptr = uni;
goto no_response;
}
/* wait_response: */
T2 = timerset (2000);
while (!timeup (T1) && CARRIER)
{
if (timeup (T2))
goto xmit_packet;
if (!CHAR_AVAIL ())
{
if (got_ESC ())
{
LOWER_DTR ();
sptr = MSG_TXT (M_KBD_MSG);
goto no_response;
}
time_release ();
continue;
}
switch (i = TIMED_READ (0))
{
case '*':
strcpy (uni, "*");
if (!get_emsi (uni))
break;
if (!stricmp (uni, emsistr[EMSI_REQ]))
continue;
if (!stricmp (uni, emsistr[EMSI_ACK]))
return (1);
goto xmit_packet;
default:
if (i <= 0) /* MB *//* Could just be line noise if > 0*/
time_release ();/*PLF Sun 12-01-1991 04:21:14 */
break;
}
}
if (!CARRIER)
sptr = MSG_TXT (M_NO_CARRIER);
else
{
(void) sprintf (uni, "!%s", MSG_TXT (M_TIMEOUT));
sptr = uni;
}
no_response:
status_line (sptr);
return (0);
} /* Send EMSI */
/*--------------------------------------------------------------------------*/
/* RECEIVE EMSI PACKET */
/*--------------------------------------------------------------------------*/
static int LOCALFUNC
Recv_EMSI_Packet (int Sender)
{
int i;
int c;
int len;
char *sptr;
byte tries = 0;
word crc, crc2;
long T1, T2, T3;
char *junkbuff, *uni, *help;
/*
* Txbuf is (8192+16) in length
* junkbuff wants to be 4096
* uni wants to be 256
* help wants to be 256
* tmpstr wants to be 256
* We reserve the last 1024+16 for lower level functions
*
* If you change this way of doing things, you have to change
* Decode_EMSI_Header as well!!!
*/
junkbuff = (char *) Txbuf;
uni = &junkbuff[4096];
help = &uni[256];
/* tmpstr = &help[256]; */
/* strcpy (remote_sysop, "Sysop"); */
remote_password = NULL;
/*--------------------------------------------------------------------*/
/* Get the EMSI structure */
/*--------------------------------------------------------------------*/
if (un_attended && fullscreen)
{
sb_move (filewin, 2, 2);
sb_puts (filewin, MSG_TXT (M_EMWAIT));
sb_show ();
}
else
{
set_xy (MSG_TXT (M_EMRECV));
}
remote_pickup = 2; /* Pickup for all akas */
T1 = timerset (2000);
T2 = timerset (6000);
sptr = NULL;
request_it:
if (tries++ > 6)
goto timeout;
if (!Sender)
{
sprintf (uni, "%s\r", emsistr[EMSI_REQ]); /* EMSI_REQ if he called me */
}
else if (tries > 1)
{
sprintf (uni, "%s\r", emsistr[EMSI_NAK]); /* EMSI_NAK anytime after 1st*/
}
else
goto watch_for_header;
SENDCHARS (uni, strlen (uni), 1); /* Kick the other guy. */
new_timer:
T1 = timerset (2000);
watch_for_header:
while (!timeup (T2) && CARRIER)
{
if (sptr)
{
status_line (sptr);
sptr = NULL;
}
if (timeup (T1))
goto request_it;
if (!CHAR_AVAIL ())
{
if (got_ESC ())
{
LOWER_DTR ();
sptr = MSG_TXT (M_KBD_MSG);
goto receive_failed;
}
time_release ();
continue;
}
switch (i = TIMED_READ (0))
{
case '*':
strcpy (uni, "*");
if (!get_emsi (uni))
break;
if (!stricmp (uni, emsistr[EMSI_HBT]))
goto new_timer;
if (!stricmp (uni, emsistr[EMSI_DAT]))
goto receive_packet;
break;
default:
if (i <= 0) /* MB *//* Could just be line noise if > 0 */
time_release ();/*PLF Sun 12-01-1991 04:21:14 */
break;
}
}
if (timeup (T2))
goto timeout;
if (!CARRIER)
{
sptr = MSG_TXT (M_NO_CARRIER);
goto receive_failed;
}
receive_packet:
if (un_attended && fullscreen)
{
sb_move (filewin, 2, 2);
sb_puts (filewin, MSG_TXT (M_EMRCPT));
sb_show ();
}
T3 = timerset (6000);
if (((int) (uni[0] = (char) TIMED_READ (3)) < 0) ||
((int) (uni[1] = (char) TIMED_READ (3)) < 0) ||
((int) (uni[2] = (char) TIMED_READ (3)) < 0) ||
((int) (uni[3] = (char) TIMED_READ (3)) < 0))
{
sptr = MSG_TXT (M_EMSHORT);
goto emsi_error;
}
if (!CARRIER)
{
sptr = MSG_TXT (M_NO_CARRIER);
goto receive_failed;
}
uni[4] = '\0';
sscanf (uni, "%x", &len);
sprintf (help, "%s%s", &(emsistr[EMSI_DAT][2]), uni);
crc = crc_block ((unsigned char *) help, strlen (help));
sptr = junkbuff;
memset (junkbuff, 0, 4096);
for (i = 0; i < len; i++)
{
while (PEEKBYTE () < 0)
{
if (timeup (T2) || timeup (T3))
goto timeout;
if (got_ESC ())
{
sptr = MSG_TXT (M_KBD_MSG);
goto receive_failed;
}
if (!CARRIER)
{
sptr = MSG_TXT (M_NO_CARRIER);
goto receive_failed;
}
time_release ();
}
c = TIMED_READ (0);
*sptr++ = (char) c;
crc = xcrc (crc, (byte) c);
}
if (((int) (uni[0] = (char) TIMED_READ (3)) < 0) ||
((int) (uni[1] = (char) TIMED_READ (3)) < 0) ||
((int) (uni[2] = (char) TIMED_READ (3)) < 0) ||
((int) (uni[3] = (char) TIMED_READ (3)) < 0))
{
sptr = MSG_TXT (M_EMSHORT);
goto emsi_error;
}
TIMED_READ (1); /* What am I throwing away here? */
if (!CARRIER)
{
sptr = MSG_TXT (M_NO_CARRIER);
goto receive_failed;
}
uni[4] = '\0';
sscanf (uni, "%hx", &crc2);
if (crc == crc2)
goto process_packet;
(void) sprintf (junkbuff, "!%s", MSG_TXT (M_CRC_MSG));
sptr = junkbuff;
emsi_error:
if (timeup (T2))
goto timeout;
CLEAR_INBOUND ();
goto request_it;
process_packet:
if (strnicmp (junkbuff, "{EMSI}", 6))
{
sptr = MSG_TXT (M_EMSTART);
goto emsi_error;
}
if (!Decode_EMSI_Header (junkbuff, len, Sender))
goto receive_failed;
(void) n_getpassword (&remote_akas[hl_aka]); /* Updated 'assumed', 'CURRENT' to match remote */
CLEAR_INBOUND ();
CLEAR_OUTBOUND ();
sprintf (uni, "%s\r", emsistr[EMSI_ACK]);
SENDCHARS (uni, strlen (uni), 1); /* Let the other system know */
SENDCHARS (uni, strlen (uni), 1); /* we got it ! */
T3 = timerset (1000);
while (!OUT_EMPTY ()) /* Flush the buffer */
{
if (timeup (T3))
goto timeout;
if (!CARRIER)
goto receive_failed;
time_release ();
}
return (1);
timeout:
(void) sprintf (uni, "!%s", MSG_TXT (M_TIMEOUT));
sptr = uni;
receive_failed:
status_line (sptr);
b_init ();
return (0);
} /* Recv EMSI */
static int LOCALFUNC
get_emsi (char *s)
{
long T1;
char *sptr, c;
int i;
T1 = timerset (500);
sptr = s + 1;
memset (sptr, 0, EMSI_LEN + 1);
while (CARRIER)
{
while (PEEKBYTE () < 0)
{
if (timeup (T1))
goto timeout;
if (got_ESC ())
{
status_line (MSG_TXT (M_KBD_MSG));
goto receive_failed;
}
if (!CARRIER)
{
status_line (MSG_TXT (M_NO_CARRIER));
goto receive_failed;
}
time_release ();
}
c = (char) TIMED_READ (0);
if (c == '\r')
{
status_line (">EMSI: '%s'", s);
return (1);
}
*sptr++ = (char) c;
for (i = 0; i < EMSI_MAX; i++)
{
if (!strnicmp (s, emsistr[i], strlen (emsistr[i])))
{
status_line (">EMSI: '%s'", s);
return (1);
}
else
{
if ((int) strlen (s) > EMSI_LEN)
{
status_line (">EMSI: '%s'", s);
return (1);
}
}
}
}
timeout:
status_line ("!%s", MSG_TXT (M_TIMEOUT));
receive_failed:
return (0);
}
static char *LOCALFUNC
b7strcat (char *d, char *s)
{
int i;
int j = strlen (s);
char uni[4], *p, *c;
p = &d[strlen (d)];
c = s;
for (i = 0; i < j; c++, i++)
{
if (*c == '\\')
{
*p++ = '\\';
*p++ = '\\';
continue;
}
/*old if((*c>=0)&&(*c<=0x7F)) */
if (!(*c & 0x80))
{
*p++ = *c;
continue;
}
*p++ = '\\'; /* Do coding only for 8 bit chars */
sprintf (uni, "%02X", (unsigned) *c);
*p++ = uni[0];
*p++ = uni[1];
continue;
}
*p++ = '\0';
return (d);
}
static LOCALFUNC
recode_from_b7 (char *s, int len)
{
int i, j;
char *d, uni[4];
unsigned c;
d = s;
for (j = i = 0; i < len; j++)
{
if (*s != '\\')
{
*d++ = *s++;
i++;
continue;
}
if (*++s == '\\')
{
*d++ = *s++;
i += 2;
continue;
}
uni[0] = *s++;
uni[1] = *s++;
uni[2] = '\0';
sscanf (uni, "%hx", &c);
*d++ = (char) c;
i += 3;
}
*d++ = '\0';
return (j); /* New length */
}
static int LOCALFUNC
get_level (ADDRP addr, ADDRP myaka)
{
int level = -1;
if ((addr->Domain == myaka->Domain) || !addr->Domain || !myaka->Domain)
level++;
else
return (level);
if (addr->Zone == myaka->Zone)
level++;
else
return (level);
if (addr->Net == myaka->Net)
level++;
else
return (level);
if (addr->Node == myaka->Node)
level++;
return (level);
}
static int LOCALFUNC
match_aka (ADDRP addr)
{
int level = -1;
int i, j;
assumed = 0;
for (i = 0; i < num_addrs; i++)
{
j = get_level (addr, &alias[i]);
if (j > level)
{
assumed = i;
level = j;
}
}
return (0);
}
/*--------------------------------------------------------------------------*/
/* Find end of EMSI field */
/*--------------------------------------------------------------------------*/
static char *LOCALFUNC
get_bracket (char *p)
{
register char c;
register char x = *(p - 1); /* Save starting character */
char *q = p;
/* Convert starting bracket to expected ending bracket */
if (x == '{')
x = '}';
else if (x == '[')
x = ']';
while ((c = *p++) != '\0')
{
/* If this is an ending bracket */
if (c == '}' || c == ']')
{
/* And it's not escaped */
if (*p != c)
{
/* And it's the right one, get out. */
if (c == x)
break;
}
else
{
/* If it is escaped, copy the end of the string over the esc */
strcpy (q, p);
}
}
q = p;
}
return (q);
}
static char *LOCALFUNC
cat_bracket (char *d, char *c) /* MB 93-11-27 */
{
char x, *p, *q;
q = p = (char *) &Txbuf[7168];
while ((x = *c++) != '\0')
{
if (*c && (x == '}' || x == ']'))
*p++ = x; /* We have to escape } or ] by doing it twice */
*p++ = x;
}
*p++ = '\0';
return (b7strcat (d, q));
}
static int LOCALFUNC
Decode_EMSI_Header (char *junkbuff, int len, int Sender)
{
int i, akacnt = 0;
int prodcodeT, logit = TRUE;
int j, addonnr;
long lmoh = 0;
int cur = 0;
char *tmpstr, *sptr, *p;
char *uni, *help, *name, *loc, password[16];
ADDR addr[ALIAS_CNT], remote;
static char *addons[] = {"{IDENT}", "{TRX#}", "{MOH#}", NULL};
uni = &junkbuff[4096]; /* Look at Recv_EMSI_Packet to see */
help = &uni[256]; /* why this is OK */
tmpstr = &help[256];
recode_from_b7 (junkbuff, len);
sptr = &junkbuff[7];
memset (&remote_addr, 0, sizeof (remote_addr));
akacnt = i = 0;
while (*sptr != '}')
{
while (*sptr == ' ')
sptr++;
/* Copy the address string into temp string. */
p = tmpstr;
while (*sptr && *sptr != '}' && *sptr != ' ')
*p++ = *sptr++;
*p = '\0';
if (p == tmpstr)
break;
memset (&addr[i], 0, sizeof (ADDR));
status_line (">EMSI: parsing addr: '%s'", tmpstr);
(void) find_address (tmpstr, &addr[i]);
status_line (">EMSI: got addr: '%s'", Full_Addr_Str (&addr[i]));
/* sscanf(sptr,"%u:%u/%u.%u",&addr[i].Zone,&addr[i].Net,&addr[i].Node,&addr[i].Point); */
if (Sender && (addr[i].Zone == called_addr.Zone) && (addr[i].Net == called_addr.Net) && (addr[i].Node == called_addr.Node) && (addr[i].Point == called_addr.Point))
remote_addr = addr[i];
if (i < (ALIAS_CNT - 1))
i++;
}
akacnt = i;
if (!remote_addr.Zone || !remote_addr.Net)
remote_addr = addr[0];
while (*sptr++ != '{')
;
i = 0;
while (*sptr != '}')
password[i++] = *sptr++;
password[i] = '\0';
sptr++;
while (*sptr != '}')
{
i = 0;
while ((*sptr != ',') && (*sptr != '}'))
uni[i++] = *sptr++;
uni[i] = '\0';
if (*sptr != '}')
sptr++;
if (!stricmp (uni, "NPU"))
remote_pickup = 0;
else if (!stricmp (uni, "PUP"))
remote_pickup = 1;
else if (!stricmp (uni, "PUA"))
remote_pickup = 2;
}
sptr++;
sptr++;
remote_capabilities = WZ_FREQ;
while (*sptr != '}')
{
i = 0;
while ((*sptr != ',') && (*sptr != '}'))
uni[i++] = *sptr++;
uni[i] = '\0';
if (*sptr != '}')
sptr++;
if (!stricmp (uni, "JAN"))
remote_capabilities |= DOES_IANUS;
#ifdef HAVE_HYDRA
else if (!stricmp (uni, "HYD"))
remote_capabilities |= DOES_HYDRA;
#endif /* HAVE_HYDRA */
else if (!stricmp (uni, "ZAP"))
remote_capabilities |= ZED_ZAPPER;
else if (!stricmp (uni, "ZMO"))
remote_capabilities |= ZED_ZIPPER;
else if (!stricmp (uni, "NRQ"))
remote_capabilities &= ~WZ_FREQ;
}
sptr++;
sptr++;
sscanf (sptr, "%x", &prodcodeT);
/* remote_mailer=prodcode; */
while (*sptr++ != '{')
;
i = 0;
while (*sptr != '}')
uni[i++] = *sptr++;
sptr++;
sptr++;
uni[i++] = ' ';
while (*sptr != '}')
uni[i++] = *sptr++;
sptr++;
sptr++;
uni[i++] = '/';
while (*sptr != '}')
uni[i++] = *sptr++;
if (uni[--i] != '/')
i++;
uni[i] = '\0';
sptr++;
for (;;)
{
if (*sptr != '{')
break;
for (addonnr = 0; addons[addonnr] != NULL; addonnr++)
{
if (!strnicmp (sptr, addons[addonnr], strlen (addons[addonnr])))
break;
}
if (!addons[addonnr]) /* no known addon */
addonnr = 0;
else
addonnr++;
switch (addonnr)
{
case 1: /* {IDENT} system name */
sptr += 9;
name = sptr;
sptr = get_bracket (sptr);
*sptr = '\0';
(void) sprintf (help, "*%s (%s)", name, Full_Addr_Str (&remote_addr));
status_line ("%s", help);
if (akacnt > 1)
{
strcpy (help, ":Aka: ");
for (j = i = 0; i < akacnt; i++)
{
if (!memcmp (&addr[i], &remote_addr, sizeof (ADDR)))
continue;
strcat (help, Full_Addr_Str (&addr[i]));
strcat (help, " ");
if (++j == 3)
{
status_line ("%s", help);
strcpy (help, ": ");
j = 0;
}
}
if (j)
status_line ("%s", help);
}
sptr += 2;
status_line ("%s %s", MSG_TXT (M_REMOTE_USES), uni);
loc = sptr;
sptr = get_bracket (sptr);
*sptr = '\0';
*uni = '\0';
if (loc[0])
sprintf (uni, " from %s", loc);
sptr += 2;
name = sptr;
sptr = get_bracket (sptr);
*sptr = '\0';
if (name[0])
{
status_line (":SysOp: %s%s", name, uni);
/* strcpy (remote_sysop,name); */
}
sptr += 2; /* phone */
name = sptr;
sptr = get_bracket (sptr);
*sptr = '\0';
sptr += 2;
sptr = get_bracket (sptr); /* baud */
*sptr = '\0';
sptr += 2; /* flags */
loc = sptr;
sptr = get_bracket (sptr);
*sptr = '\0';
if (loc[0] && name[0] && strcmp (name, "-Unpublished-"))
{
status_line (" Phone: %s", name);
status_line (" Flags: %s", loc);
}
while (*sptr++ != '}')
;
break;
case 2: /* {TRX#} tranx */
sptr += 8;
name = sptr;
sptr = get_bracket (sptr);
*sptr = '\0';
#ifdef ANSI_TIME_T
status_line (":Tranx: %08lX / %s", etm - ANSI_TIME_T_DELTA, name);
#else
status_line (":Tranx: %08lX / %s", etm, name);
#endif
while (*sptr++ != '}')
;
break;
case 3: /* {MOH#} mail on hold */
sptr += 8;
name = sptr;
sptr = get_bracket (sptr);
*sptr = '\0';
sscanf (name, "%lX", &lmoh);
status_line (">Mail on Hold: %ldb", lmoh);
while (*sptr++ != '}')
;
break;
default: /* any other addon */
name = ++sptr;
while (*sptr != '}')
sptr++; /* goto end of addon string */
*sptr++ = '\0';
loc = ++sptr;
sptr = get_bracket (sptr); /* MB new */
*sptr++ = '\0';
status_line (">Unknown EMSI Addon: %s: {%s}", name, loc);
break;
}
}
remote = remote_addr;
if (!remote_pickup)
status_line (" Remote refused mail-pickup");
if (Sender)
remote_addr = called_addr;
CURRENT = DEFAULT;
for (i = 0; i <= akacnt; i++)
{
status_line (">EMSI: checking addr: '%s'", Full_Addr_Str (&remote_addr));
if ((j = n_getpassword (&remote_addr)) > 0)
{
if (Sender && *remote_password && !*password && (prodcodeT == isDBRIDGE))
j = 0; /* work-around for a D'Bridge(tm)-Bug */
else
j = n_password (password, remote_password, &logit);
status_line (">EMSI: result of pw check: '%d'", j);
if (j == 0)
{
if (highest_level < 2)
{
highest_level = 2;
hl_aka = num_rakas;
}
}
else
{
/*
* Password doesn't match.
*
* Result of 1 means both of us had one.
*
* Result of 2 means we had one and the other side didn't.
*
* If we are the sender we will accept this mismatch,
* but only on the first aka.
*
*/
if ((!Sender) || (num_rakas != 0))
goto next_one;
else
status_line (MSG_TXT (M_PASSWORD_OVERRIDE));
if (highest_level < 1)
{
highest_level = 1;
hl_aka = num_rakas;
}
}
}
else if (j < 0)
{
status_line (">EMSI: addr '%s' will be curmudgeoned", Full_Addr_Str (&remote_addr));
cur = 1;
goto next_one;
}
status_line (">EMSI: checking addr '%s' for dupe", Full_Addr_Str (&remote_addr));
for (j = 0; j < num_rakas; j++)
{
if (get_level (&remote_addr, &(remote_akas[j])) == 3)
goto next_one;
}
status_line (">EMSI: using addr: '%s'", Full_Addr_Str (&remote_addr));
remote_akas[num_rakas++] = remote_addr;
next_one:
remote_addr = addr[i];
}
if (!num_rakas)
{
if (cur)
sptr = MSG_TXT (M_NUISANCE_CALLER);
else
sptr = NULL;
LOWER_DTR (); /* He'll never get it right */
timer (2); /* Wait two secs */
return (0);
}
remote_addr = remote;
return (1);
}
static int LOCALFUNC
Encode_EMSI_Header (char *junkbuff, int Sender)
{
int i, capabilities = 0;
char *uni;
uni = &junkbuff[4096]; /* See why this is OK in Send_EMSI_Packet */
strcpy (junkbuff, "{EMSI}");
b7strcat (junkbuff, "{");
match_aka (&remote_addr); /* Update 'assumed' */
status_line (">Used Aka: %s", Full_Addr_Str (&alias[assumed]));
b7strcat (junkbuff, Full_Addr_Str (&alias[assumed]));
for (i = 0; i < num_addrs; i++)
{
if (i != assumed)
{
b7strcat (junkbuff, " ");
b7strcat (junkbuff, Full_Addr_Str (&alias[i]));
}
}
b7strcat (junkbuff, "}{");
remote_password = NULL;
if ((Sender && (n_getpassword (&remote_addr) > 0)) ||
(!Sender && (n_getpassword (&remote_akas[hl_aka]) > 0)))
{
if (remote_password)
{
(void) strncpy ((char *) uni, remote_password, 8);
uni[8] = '\0';
b7strcat (junkbuff, uni);
}
}
b7strcat (junkbuff, "}{8N1");
if (Sender)
{
if (!no_pickup)
{
if (pickup_all)
b7strcat (junkbuff, ",PUA");
else
b7strcat (junkbuff, ",PUP");
}
else
b7strcat (junkbuff, ",NPU");
}
else
{
if (matrix_mask & NO_TRAFFIC)
b7strcat (junkbuff, ",HAT");
if (!(matrix_mask & TAKE_REQ))
b7strcat (junkbuff, ",HRQ");
}
b7strcat (junkbuff, "}{");
/* At least one ZModem protocol must be available for FSC-0056 ! */
if (!my_capabilities & ZED_ZIPPER)
my_capabilities |= ZED_ZIPPER;
/*
* If we are the calling system, turn on all our capabilities.
* If we are the called system, choose from the set that the
* caller gave us, and only send the one we prefer.
*/
if (!Sender)
{
if (remote_capabilities & my_capabilities & DOES_IANUS)
capabilities = DOES_IANUS;
#ifdef HAVE_HYDRA
else if (remote_capabilities & my_capabilities & DOES_HYDRA)
capabilities = DOES_HYDRA;
#endif /* HAVE_HYDRA */
else if (remote_capabilities & my_capabilities & ZED_ZAPPER)
capabilities = ZED_ZAPPER;
else if (remote_capabilities & my_capabilities & ZED_ZIPPER)
capabilities = ZED_ZIPPER;
}
else
capabilities = my_capabilities;
#ifdef HAVE_HYDRA
if (!capabilities & (DOES_IANUS | DOES_HYDRA | ZED_ZAPPER | ZED_ZIPPER))
#else
if (!capabilities & (DOES_IANUS | ZED_ZAPPER | ZED_ZIPPER))
#endif /* HAVE_HYDRA */
b7strcat (junkbuff, "NCP,");
else if (Sender)
{
if (capabilities & DOES_IANUS)
b7strcat (junkbuff, "JAN,");
#ifdef HAVE_HYDRA
if (capabilities & DOES_HYDRA)
b7strcat (junkbuff, "HYD,");
#endif /* HAVE_HYDRA */
if (capabilities & ZED_ZAPPER)
b7strcat (junkbuff, "ZAP,");
if (capabilities & ZED_ZIPPER)
b7strcat (junkbuff, "ZMO,");
}
else
{
if (capabilities & DOES_IANUS)
b7strcat (junkbuff, "JAN,");
#ifdef HAVE_HYDRA
else if (capabilities & DOES_HYDRA)
b7strcat (junkbuff, "HYD,");
#endif /* HAVE_HYDRA */
else if (capabilities & ZED_ZAPPER)
b7strcat (junkbuff, "ZAP,");
else if (capabilities & ZED_ZIPPER)
b7strcat (junkbuff, "ZMO,");
}
if (!(matrix_mask & TAKE_REQ) || (Sender && !on_our_nickel))
{
b7strcat (junkbuff, "NRQ,");
}
else
capabilities |= WZ_FREQ;
b7strcat (junkbuff, "ARC,XMA");
b7strcat (junkbuff, ",FNC");
b7strcat (junkbuff, "}"); /* MB 93-11-27 */
sprintf (uni, "{%02X}", PRDCT_CODE);
b7strcat (junkbuff, uni);
sprintf (uni, "{%s}", PRDCT_PRTY);
cat_bracket (junkbuff, uni);
sprintf (uni, "{%d.%02d}",
BINK_MAJVERSION, /* vvv */
BINK_MINVERSION);
b7strcat (junkbuff, uni);
sprintf (uni, "{%s}", ((serial == -1) ? MSG_TXT (M_UNREGISTERED) : ""));
cat_bracket (junkbuff, uni);
b7strcat (junkbuff, "{IDENT}{");
sprintf (uni, "[%s]", system_name);
cat_bracket (junkbuff, uni);
sprintf (uni, "[%s]", location); /* vvv */
cat_bracket (junkbuff, uni);
sprintf (uni, "[%s]", sysop);
cat_bracket (junkbuff, uni);
sprintf (uni, "[%s]", myphone);
cat_bracket (junkbuff, uni);
sprintf (uni, "[%s]", mymaxbaud);
cat_bracket (junkbuff, uni);
sprintf (uni, "[%s]", myflags);
cat_bracket (junkbuff, uni); /* MB 93-11-27 */
b7strcat (junkbuff, "}{TRX#}");
#ifdef ANSI_TIME_T
sprintf (uni, "{[%08lX]}", etm - ANSI_TIME_T_DELTA);
#else
sprintf (uni, "{[%08lX]}", etm);
#endif
b7strcat (junkbuff, uni);
return (strlen (junkbuff));
}
/* END OF FILE: emsi.c */